package com.hsyg.netty.client.handler;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

/**
 * 当客户端和服务端tcp链路简历成功后，
 * netty的nio线程会调用channelActive方法，
 * 发送查询时间的指令给服务端，
 * 调用ChannelHandlerContext的writeAndFlush方法将请求消息发送给服务端
 * <p>
 * 当服务端返回应答消息时，channelRead方法被调用
 */
public class ClientHandler2 extends
  //ChannelHandlerAdapter {
  ChannelInboundHandlerAdapter {

  private int counter;

  private byte[] bytes;

  public ClientHandler2() {
    bytes = "i love you \n".getBytes();
  }

  /**
   * netty的nio线程会调用channelActive方法，
   * 发送查询时间的指令给服务端，
   * 调用ChannelHandlerContext的writeAndFlush方法将请求消息发送给服务端
   *
   * @param ctx
   * @throws Exception
   */
  @Override
  public void channelActive(ChannelHandlerContext ctx) throws Exception {
    ByteBuf message = null;

    //向服务端发送数据
    for (int i = 0; i < 10000; i++) {
      message = Unpooled.buffer(bytes.length);
      message.writeBytes(bytes);
      ctx.writeAndFlush(message);
    }

  }

  /**
   * 当服务端返回应答消息时，channelRead方法被调用
   *
   * @param ctx
   * @param msg
   * @throws Exception
   */
  @Override
  public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    //读取服务端发过来的数据
    String body = (String) msg;
    System.out.println("客户端收到的消息： " + body + " the counter is:" + ++counter);
  }

  /**
   * 当发生异常时， 关闭ChannelHandlerContext，释放ChannelHandlerContext相关联的句柄等资源
   *
   * @param ctx
   * @param cause
   * @throws Exception
   */
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    System.out.println("exceptionCaught...");
    ctx.close();
  }
}
